package com.rookie.tool.module.util.string;

import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串工具类
 * 替换内容、获取开始到结束的字符、获取中间字符、正则替换
 *
 * @author rookie
 */
public class StringCutUtils {

    /**
     * 替换所有正则表达式内容
     *
     * @param text 源字符串
     * @param reg 正则表达式
     * @param startText 正则开始字符串常量
     * @param endText 正则结束字符串常量
     * @param itemText 替换的字符
     * @return 截取的字符
     */
    public static String replaceInnerRegText(String text, String reg, String startText, String endText, String itemText) {
        int times = 1000;
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(text);

        while (matcher.find()) {
            if (times < 1) {
                break;
            }
            String group = matcher.group();
            String openText = getOpenText(group, startText, endText);
            text = text.replace(startText + openText + endText, startText + itemText + endText);
            times--;
        }
        return text;
    }

    /**
     * 替换所有开始到结束字符串的中间字符串为指定内容,最多替换1000次
     *
     * @param text      源字符串
     * @param startText 开始字符串
     * @param endText   结束字符串
     * @return 被替换的字符
     */
    public static String replaceInnerText(String text, String startText, String endText, String itemText) {
        int times = 1000;
        while (text.contains(startText)) {
            if (times < 1) {
                break;
            }
            String innerText = getOpenText(text, startText, endText);
            text = text.replace(startText + innerText + endText, startText + itemText + endText);
            times--;
        }
        return text;
    }

    /**
     * 替换 s + inner字符串为指定内容,最多替换1000次
     *
     * @param text      源字符串
     * @param startText 开始字符串
     * @param endText   结束字符串
     * @return 被替换的字符
     */
    public static String replaceLeftText(String text, String startText, String endText, String itemText) {
        int times = 1000;
        while (text.contains(startText)) {
            if (times < 1) {
                break;
            }
            String innerText = getOpenText(text, startText, endText);
            text = text.replace(startText + innerText + endText, itemText + endText);
            times--;
        }
        return text;
    }

    /**
     * 替换 e + inner字符串为指定内容,最多替换1000次
     *
     * @param text      源字符串
     * @param startText 开始字符串
     * @param endText   结束字符串
     * @return 被替换的字符
     */
    public static String replaceRightText(String text, String startText, String endText, String itemText) {
        int times = 1000;
        while (text.contains(startText)) {
            if (times < 1) {
                break;
            }
            String innerText = getOpenText(text, startText, endText);
            text = text.replace(startText + innerText + endText, startText + itemText);
            times--;
        }
        return text;
    }

    /**
     * 截取开始到结束的字符串,区间为(,)
     *
     * @param text      原始字符串
     * @param startText 开始字符串
     * @param endText   结束字符串
     * @return 截取字符, 不存在则返回null
     */
    public static String getOpenText(String text, String startText, String endText) {
        return getInnerText(text, startText, endText, false, false);
    }

    /**
     * 截取开始到结束的字符串,区间为[,)
     *
     * @param text      原始字符串
     * @param startText 开始字符串
     * @param endText   结束字符串
     * @return 截取字符, 不存在则返回null
     */
    public static String getLeftText(String text, String startText, String endText) {
        return getInnerText(text, startText, endText, true, false);
    }

    /**
     * 截取开始到结束的字符串,区间为(,]
     *
     * @param text      原始字符串
     * @param startText 开始字符串
     * @param endText   结束字符串
     * @return 截取字符, 不存在则返回null
     */
    public static String getRightText(String text, String startText, String endText) {
        return getInnerText(text, startText, endText, false, true);
    }

    /**
     * 截取开始到结束的字符串,区间为[,]
     *
     * @param text      原始字符串
     * @param startText 开始字符串
     * @param endText   结束字符串
     * @return 截取字符, 不存在则返回null
     */
    public static String getCloseText(String text, String startText, String endText) {
        return getInnerText(text, startText, endText, true, true);
    }

    /**
     * 截取开始到结束的字符串,区间[],(,)等
     *
     * @param text      原始字符串
     * @param startText 开始字符串
     * @param endText   结束字符串
     * @param startCut  控制左区间是否闭合
     * @param endCut    控制右区间是否闭合
     * @return 截取字符
     */
    private static String getInnerText(String text, String startText, String endText, boolean startCut, boolean endCut) {

        if (inspectTextEmpty(text, startText, endText)) {
            return null;
        }

//        返回字符串中第一个字符的位置
        int startIndex = text.indexOf(startText);

//        当开始字符串超出可能会出现起始查找位置超出字符串
        int endIndex = text.indexOf(endText, startIndex + startText.length());

        if (inspectTextNotFind(startIndex, endIndex)) {
            return null;
        }
        int startCutIndex = -1;
        int endCutIndex = -1;

        if (startCut) {
            startCutIndex = startIndex;
        } else {
            startCutIndex = startIndex + startText.length();
        }

        if (endCut) {
            endCutIndex = endIndex + endText.length();
        } else {
            endCutIndex = endIndex;
        }
        return text.substring(startCutIndex, endCutIndex);
    }

    public static void main(String[] args) {
        String patternString = "[0-9]+";
        Pattern pattern = Pattern.compile(patternString);

        String text = "abcd123acca123a1a2";
        Matcher matcher = pattern.matcher(text);


        while (matcher.find()) {


            String group = matcher.group();
            System.out.print(group + ":  ");

            System.out.println(matcher.start() + "->" + (matcher.end() - 1));

            text = text.replaceAll(group, "哈哈");
            System.out.println(text);
        }
        /*String text = "<img src='https://www.baidu.com'/><img src='https://www.baidu.com'/><img src='https://www.baidu.com'/>";
        String innerText = replaceRightText(text, "<img src='", "'/>", "666");
        System.out.println(innerText);*/

    }


    /**
     * 验证字符串参数中是否存在为空
     *
     * @param args 可变长字符参数
     * @return true：存在 false：不存在
     */
    private static boolean inspectTextEmpty(String... args) {
        for (String arg : args) {
            if (StringUtils.isBlank(arg)) {
                return true;
            }
        }
        return false;
    }

    private static boolean inspectTextNotFind(int... args) {
        for (int arg : args) {
            if (arg == -1) {
                return true;
            }
        }
        return false;
    }
}
